package controller

import (
	"gin_server/internal/request"
	"gin_server/internal/service"
	"gin_server/pkg/response"
	"strconv"

	"github.com/gin-gonic/gin"
)

type UserController struct {
	service service.UserService
}

func NewUserController(s service.UserService) *UserController {
	return &UserController{service: s}
}

// GetUser 根据ID获取用户
// @Summary 根据ID获取用户
// @Description 根据ID获取用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "userID"
// @Success 200 {object} response.Response{data=model.User}
// @Security BearerAuth
// @Router /user/{id} [get]
func (c *UserController) GetUser(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	entity, err := c.service.GetUserByID(int64(id))
	if err != nil {
		response.Error(ctx, err.Error())
		return
	}

	response.SuccessWithMessage(ctx, "获取成功", entity)
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 获取用户列表
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param params query request.UserQueryRequest true "用户查询参数"
// @Success 200 {object} response.Response{data=response.PageResponse{total=int64,list=[]model.User}}
// @Security BearerAuth
// @Router /user [get]
func (c *UserController) GetUserList(ctx *gin.Context) {
	var query request.UserQueryRequest
	// 绑定查询参数
	if err := ctx.ShouldBindQuery(&query); err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	entities, total, err := c.service.GetAllUser(&query)
	if err != nil {
		response.Error(ctx, err.Error())
		return
	}

	response.PageSuccess(ctx, total, entities)
}

// CreateUser 创建用户
// @Summary 创建新用户
// @Description 创建新用户记录
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param entity body request.UserCreateRequest true "用户信息"
// @Success 200 {object} response.Response{data=model.User}
// @Security BearerAuth
// @Router /user [post]
func (c *UserController) CreateUser(ctx *gin.Context) {
	var entity request.UserCreateRequest
	if err := ctx.ShouldBindJSON(&entity); err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	result, createErr := c.service.CreateUser(entity.ToModel())
	if createErr != nil {
		response.Error(ctx, createErr.Error())
		return
	}

	response.SuccessWithMessage(ctx, "创建成功", result)
}

// UpdateUser 更新用户
// @Summary 更新用户
// @Description 更新用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "userID"
// @Param entity body request.UserUpdateRequest true "用户信息"
// @Success 200 {object} response.Response{data=model.User}
// @Security BearerAuth
// @Router /user/{id} [put]
func (c *UserController) UpdateUser(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	var entity request.UserUpdateRequest
	if err := ctx.ShouldBindJSON(&entity); err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	if err := c.service.UpdateUser(uint(id), &entity); err != nil {
		response.Error(ctx, err.Error())
		return
	}

	result, getErr := c.service.GetUserByID(int64(id))
	if getErr != nil {
		response.Error(ctx, getErr.Error())
		return
	}

	response.SuccessWithMessage(ctx, "更新成功", result)
}

// DeleteUser 删除用户
// @Summary 删除用户
// @Description 删除用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "userID"
// @Success 200 {object} response.Response{data=nil}
// @Security BearerAuth
// @Router /user/{id} [delete]
func (c *UserController) DeleteUser(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	if err := c.service.DeleteUser(uint(id)); err != nil {
		response.Error(ctx, err.Error())
		return
	}

	response.SuccessWithMessage(ctx, "删除成功", nil)
}

// RestoreUser 恢复用户
// @Summary 恢复用户
// @Description 恢复用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "userID"
// @Success 200 {object} response.Response{data=nil}
// @Security BearerAuth
// @Router /user/{id}/restore [put]
func (c *UserController) RestoreUser(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	if err := c.service.RestoreUser(uint(id)); err != nil {
		response.Error(ctx, err.Error())
		return
	}

	response.SuccessWithMessage(ctx, "恢复成功", nil)
}

// ForceDeleteUser 真删除用户
// @Summary 真删除用户
// @Description 真删除用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "userID"
// @Success 200 {object} response.Response{data=nil}
// @Security BearerAuth
// @Router /user/{id}/force [delete]
func (c *UserController) ForceDeleteUser(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		response.BadRequest(ctx, err.Error())
		return
	}

	if err := c.service.ForceDeleteUser(uint(id)); err != nil {
		response.Error(ctx, err.Error())
		return
	}

	response.SuccessWithMessage(ctx, "删除成功", nil)
}
